package com.cssl.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cssl.api.OrderApi;
import com.cssl.dto.UpdateEquipmentDTO;
import com.cssl.entity.Equipment;
import com.cssl.entity.EquipmentRegion;
import com.cssl.exception.BusinessException;
import com.cssl.service.EquipmentService;
import com.cssl.mapper.EquipmentMapper;
import com.google.common.collect.Lists;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
* @author 风止
* @description 针对表【equipment】的数据库操作Service实现
* @createDate 2025-03-22 22:05:17
*/
@Service
@Transactional
public class EquipmentServiceImpl extends ServiceImpl<EquipmentMapper, Equipment>
    implements EquipmentService{

    @Autowired
    private OrderApi orderApi; // 订单服务对外调用接口

    /**
     * 批量更新
     * @param listEq
     * @return
     */
    @GlobalTransactional(name="batchUpdateEq",rollbackFor = Exception.class)
    @Override
    public Boolean batchUpdateEq(List<UpdateEquipmentDTO> listEq) throws BusinessException {
        try {
            List<Equipment> listEqToAdd = new ArrayList<>(); //新增的数据集合
            List<Equipment> listEqToUpdate = new ArrayList<>(); //修改的数据集合
            //查询数据库中的所有座位 id //批量删除使用
            List<Long> listId = super.baseMapper.findID();
            listEq.forEach(e -> {
                if (e.getId() == null) {
                    // 没有主键，认为是需要插入的记录
                    listEqToAdd.add(new Equipment(
                            e.getSeat_id(),
                            e.getItem_name(),
                            e.getStatus(),
                            e.getRow_position(),
                            e.getCol_position(),
                            e.getFloor(),
                            e.getModule_type(),
                            LocalDateTime.now(),
                            LocalDateTime.now(),
                            e.getRegion_id()
                    ));
                } else {
                    // 有主键，认为是需要更新的记录 同时在listId中移除当前主键id
                    listId.remove(Long.parseLong(e.getId().toString())); //移除主键id
                    listEqToUpdate.add(new Equipment(
                            e.getId(),
                            e.getSeat_id(),
                            e.getItem_name(),
                            e.getStatus(),
                            e.getRow_position(),
                            e.getCol_position(),
                            e.getFloor(),
                            e.getModule_type(),
                            LocalDateTime.now(),
                            LocalDateTime.now(),
                            e.getRegion_id()
                    ));
                }
            });

            // 批量插入
            if (!listEqToAdd.isEmpty()) {
                super.saveBatch(listEqToAdd);
            }

            // 批量更新
            if (!listEqToUpdate.isEmpty()) {
                super.updateBatchById(listEqToUpdate);
            }
            //删除座位表下的子表 equipment_repair，product_details，product_order
            //Long 转 int
            List<Integer> intList = Lists.transform(listId, longValue -> longValue.intValue());
            orderApi.deleteOrderEid(intList);

            // 批量删除
            if (!listId.isEmpty()) {
                super.baseMapper.deleteByIds(listId);
            }
        } catch (Exception e) {
            // 捕获异常，记录日志，并抛出业务异常
            throw new BusinessException("订单创建失败：" + e.getMessage(), e);
        }
        return true;
    }

    /**
     * 查询全部座位 和所在区域 （多对一）
     * @return
     */
    @Override
    public List<Equipment> findEquipment() {
        return super.baseMapper.select();
    }

    /**
     * 查询所有主键
     * @return
     */
    @Override
    public List<Long> findID() {
        return super.baseMapper.findID();
    }
}




